package com.zjb.demo.common.util;

import cn.hutool.core.util.StrUtil;
import com.zjb.demo.common.constant.MimeTypeConstants;

import java.util.List;

/**
 * @author 庄佳彬
 * @since 2023/12/23 23:27
 */
public class FileUtils {

    /**
     * 检查是否允许下载指定文件
     *
     * @param file 文件路径
     * @return 如果允许下载则返回true，否则返回false
     */
    public static boolean checkAllowDownload(String file) {
        if ("..".equals(file)) {
            return false;
        }
        return MimeTypeConstants.DEFAULT_ALLOWED_EXTENSION.contains(getExtendName(file));
    }


    /**
     * 获取文件扩展名
     *
     * @param fileName 文件名
     * @return 文件扩展名，如果不存在扩展名则返回null
     */
    public static String getExtendName(String fileName) {
        if (fileName == null) {
            return null;
        }
        int index = fileName.lastIndexOf(".");
        if (index == -1) {
            return null;
        }
        return fileName.substring(index + 1).toLowerCase();
    }


    /**
     * 将文件大小转换为易读的格式
     *
     * @param size 文件大小，以字节为单位
     * @return 转换后的文件大小，以易读的格式表示，如果无法转换则返回null
     */
    public static String convertFileSize(long size) {
        var kb = 1024;
        var mb = kb * 1024;
        var gb = mb * 1024;
        if (size >= gb) {
            return String.format("%.1f GB", (float) size / gb);
        } else if (size >= mb) {
            float f = (float) size / mb;
            return String.format(f > 100 ? "%.0f MB" : "%.1f MB", f);
        } else if (size >= kb) {
            float f = (float) size / kb;
            return String.format(f > 100 ? "%.0f KB" : "%.1f KB", f);
        } else {
            return String.format("%d B", size);
        }
    }

    /**
     * 判断给定的文件名是否是允许的扩展名。
     *
     * @param name                    文件名
     * @param defaultAllowedExtension 默认允许的扩展名列表
     */
    public static void assertAllowed(String name, List<String> defaultAllowedExtension) {
        var extendName = getExtendName(name);
        if (extendName != null) {
            var match = defaultAllowedExtension.stream()
                    .allMatch(str -> str.equalsIgnoreCase(extendName));
            if (!match) {
                throw new RuntimeException("文件类型[" + extendName + "]不在范围内[" + StrUtil.join(",", defaultAllowedExtension) + "]");
            }
        }
    }

}
